﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Biblioteca.DataBase;
using Pms.Utils;
using SERIX.Util;
using System.Data.Common;
using System.Drawing;
using Biblioteca.Objetos;

namespace SERIX.Controles
{
    class LBTemplate : ITemplate
    {
        public void InstantiateIn(Control container)
        {
            LinkButton lb = new LinkButton();
            lb.ID = "LinkButton1";
            lb.OnClientClick = "LinkButton1_Click";
            lb.CausesValidation = false;
            lb.Font.Overline = false;
            lb.ForeColor = Color.Black;
            container.Controls.Add(lb);
        }
    }


    public partial class lovGenerica : System.Web.UI.UserControl
    {
        string _sessionId;
        string _filtro_adicional = " ";

        public string FiltroAdicional
        {
            get
            {
                return this._filtro_adicional;
            }
            set
            {
                this._filtro_adicional = value;
            }
        }

        public delegate void SelecaoDelegate(string chave, string descricao);
        public event SelecaoDelegate Selecao;
        public delegate string FiltroDelegate();
        public event FiltroDelegate ObterFiltro;

        private string _chave;
        private string _descricao;
        private string _tabela;
        private string _schema;
        private string _campo_ordenacao;

        # region Como Usar ?
        /*
         * lovSelecao é o método que irá obter os valores selecionado na lov
         * 
        private void lovSelecao(string chave, string descricao)
        {
            tbMunicipio.Text = descricao;
            tbMunicipio.Attributes.Add("chave", chave);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            lovMunicipio.Selecao += new SERIX.Controles.lovGenerica.SelecaoDelegate(lovSelecao);
            lovMunicipio.ConfigurarLov("Serix", "srx_municipios", "IDT_MUN", "NOME_MUN", "NOME_MUN", "Pesquisa de Municípios", "Nome"); 
        }
        */
        #endregion Como Usar

        protected void Page_Load(object sender, EventArgs e)
        {
            _sessionId = "pagAtual" + this.ID;
            Navegador1.SessionId = _sessionId;
            Navegador1.Pesquisar += new SERIX.Controles.Navegador.PesquisarDelegate(Pesquisar);

            if (!Page.IsPostBack)
            {
                Session[_sessionId] = 1;
                Navegador1.CarregueBotoes(0);
            }
            btnLov.Attributes.Add("onclick", "fnSetFocus('" + txtFiltrar.ClientID + "');");
            #region Javascript Focus
            /* Código JavaScript para que a linha acima funcione!
              <script type="text/javascript">
                        var clientid;
                        function fnSetFocus(txtClientId)
                        {
        	                clientid=txtClientId;
        	                setTimeout("fnFocus()",100);
                            
                        }
                        function fnFocus()
                        {
                            eval("document.getElementById('"+clientid+"').focus()");
                        }
                        function fnClickOK(sender, e) { 
                          __doPostBack(sender,e); 
                        } 
                </script>
              */
            #endregion Javascript Focus
        }

        /// <summary> 
        /// Método que configura a lov
        /// </summary>
        /// <param name="schema">Schema do Banco</param>
        /// <param name="tabela">Tabela onde será efetuada a consulta</param>
        /// <param name="chave">Campo Chave da Tabela</param>
        /// <param name="descricao">Campo que será exibido na Lov</param>
        /// <param name="campo_ordenacao">Campo que define a ordenação do grid</param>
        /// <param name="titulo">Titulo da Lov</param>
        /// <param name="cabecalho">Header do grid </param>
        public void ConfigurarLov(string schema, string tabela, string chave, string descricao, string campo_ordenacao, string titulo, string cabecalho)
        {
            _chave = chave;
            _descricao = descricao;
            _tabela = tabela;
            _schema = schema;
            _campo_ordenacao = campo_ordenacao;
            lbTitulo.Text = titulo;
            gridView.Columns[0].HeaderText = cabecalho;
            /*
             * 
            //BoundField bf = new BoundField();
            //bf.DataField = chave;
            //bf.HeaderText = "IDT";
            //bf.Visible = false;
            //gridView.Columns.Add(bf);
            //TemplateField tf = new TemplateField();
            //tf.ItemTemplate = new LBTemplate();
            //gridView.Columns.Add(tf);

            
            //BoundColumn bc1 = new BoundColumn();
            //bc1.DataField = chave;
            //bc1.HeaderText = "IDT";
            //gridView.Columns.Add(bc1);
            //TemplateColumn template = new TemplateColumn();
            //template.ItemTemplate = new LBTemplate();
            //gridView.Columns.Add(template);
            */
        }

        protected void btnLov_Click(object sender, EventArgs e)
        {

        }

        protected void btnPequisar_Click(object sender, EventArgs e)
        {
            Navegador1.ResetPagina();
            Pesquisar();
        }

        protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
        {
            Panel1_ModalPopupExtender.Hide();
        }

        protected void Pesquisar()
        {
            
            QueryPaginada qy = null;

            string filtro = "";

            switch (RadioButtonList1.SelectedValue)
            {
                case "E": filtro = " UPPER(:" + _descricao + ")  || '%'"; break;
                case "D": filtro = "'%' || UPPER(:" + _descricao + ")"; break;
                case "A": filtro = "'%' || UPPER(:" + _descricao + ") || '%'"; break;
            }
            string filtroExtra;
            if(ObterFiltro == null)
                filtroExtra = string.Empty;
            else
                filtroExtra = ObterFiltro();

            string SQL = @" SELECT " + _chave + ", " + _descricao +
                          " FROM " + _schema + "." + _tabela +
                          " WHERE UPPER(" + _descricao + ") LIKE " + filtro +
                          " " + filtroExtra + " " +
                          " order by " + _campo_ordenacao;
            try
            {
                Usuario usuAut = (Usuario)Session["usuario"];
                qy = new QueryPaginada(BiblioPMS.ObterConexao(BiblioPMS.aplicacaoSNG, usuAut.Login, BiblioPMS.Demo), SQL, BiblioSERIX.tamPagLov);
                qy.AdicionarParametro(_descricao, DbType.String, txtFiltrar.Text);
                gridView.DataSource = qy.Executar(Convert.ToInt32(Session[_sessionId]));
                gridView.DataBind();
                Navegador1.CarregueBotoes(qy.QtdLinhas());
            }
            catch
            {
                if (qy.EstadoConexao() == ConnectionState.Open)
                    qy.FecharConexao();
            }
            finally
            {
                if (qy.EstadoConexao() == ConnectionState.Open)
                    qy.FecharConexao();
            }
            Panel1_ModalPopupExtender.Show();
        }

        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            string chave = ((LinkButton)sender).Attributes["chave"];
            string descricao = ((LinkButton)sender).Text;
            Selecao(chave, descricao);
            Panel1_ModalPopupExtender.Hide();
        }

        protected void gridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                string IDT = ((DbDataRecord)e.Row.DataItem)[_chave].ToString();
                string DESC = ((DbDataRecord)e.Row.DataItem)[_descricao].ToString();
                ((LinkButton)e.Row.Cells[gridView.Columns.Count - 1].Controls[1]).Attributes.Add("chave", IDT);
                ((LinkButton)e.Row.Cells[gridView.Columns.Count - 1].Controls[1]).Text = DESC;
            }
        }
    }
}